// 169. 多数元素
// 给定一个大小为 n 的数组 nums ，返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

// 你可以假设数组是非空的，并且给定的数组总是存在多数元素。

 

// 示例 1：

// 输入：nums = [3,2,3]
// 输出：3
// 示例 2：

// 输入：nums = [2,2,1,1,1,2,2]
// 输出：2
 

// 提示：
// n == nums.length
// 1 <= n <= 5 * 104
// -109 <= nums[i] <= 109
 

// 进阶：尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function(nums) {
    // 同归于尽法，变量1： 当前最多的数字，变量2： 该数字出现的次数
    // 规则： 和变量1 相同的数字，则增加变量二，反之减少，变量2 为0重置变量1
    // 在假定条件下，变量1必有值
    let cur = nums[0], count = 1;
    for(let i = 1; i < nums.length; i ++) {
        if (nums[i] !== cur) {
            if(count === 1) {
                cur = nums[i + 1];
                i ++;
                continue;
            }
            count --;
            continue;
        }
        count ++;
    }
    return cur
};

/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function(nums) {
    // 同归于尽法，变量1： 当前最多的数字，变量2： 该数字出现的次数
    // 规则： 和变量1 相同的数字，则增加变量二，反之减少，变量2 为0重置变量1
    // 在假定条件下，变量1必有值
    let cur = null, count = 0;
    for(let i = 0; i < nums.length; i ++){
        if(count === 0) {
            cur = nums[i];
            count ++;
            continue;
        }
        if (cur !== nums[i]) {
            count --;
        } else {
            count ++;
        }
    } 
    return cur;
    
};

/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function (nums) {
    // 投机取巧法
    nums.sort();
    return nums[Math.floor(nums.length / 2)]
};